SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
/*
	====== MANEJA AUDITORIA CUANDO SE REALIZA UN UPDATE SOBRE UNA TABLA ======
*/
CREATE PROCEDURE [dbo].[spUpdateAudit] 
@table varchar(100),
@key varchar(50),
@value varchar(50),
@usuario varchar(50),
@dirIP varchar(15),
@origen varchar(50)
--@auditoria varchar(50)
AS
SET NOCOUNT ON
declare @auditoria int
select @auditoria = 1
declare @baja varchar(1)
declare @hasta datetime
declare @campo varchar(50)
declare @cod int
declare @valores varchar(900)
declare @evento int
declare @op varchar(50)
declare @valorCampo varchar(255)
declare @idAccion int
declare @jefe int
declare @idRegistroAuditoria int

		declare @idAuditoria int
		
		--Select @cod = (Select max(idRegistroAuditoria) from tb_RegistroAuditoria)
		--select @cod = @cod+1
			
		select @jefe = (Select idUsuario from tb_Usuarios where upper(esjefe) = 'S' and idReparticion in (Select tb_Usuarios.idReparticion from tb_Usuarios where idUsuario = @usuario))
		
		declare @FechaRegistro varchar(25)
		select @FechaRegistro = cast(month(getdate()) as varchar(3))+'/'+cast(day(getdate()) as varchar(3))+'/'+cast(year(getdate()) as varchar(4))		

		insert into tb_registroEventos(fecha, idUsuario1, severidad, causa, idUsuario2, descripcion)
		values (@FechaRegistro, @usuario, 5, @origen, @jefe, 'Exe spUpdateAudit: '+@table)		

		-- Creamos un cursor por si existen varios campos por guardar
		declare cursor_Auditoria cursor for
		Select baja, hasta, campo, Evento, AccionAuditoria, idAuditoria from tb_Auditoria where TablaOSP = @table and Evento=2 and baja<>'S'
		
		open cursor_Auditoria
		fetch next from cursor_Auditoria
		into @baja, @hasta, @campo, @evento, @idAccion, @idAuditoria
					
select @op = (Select evento from tb_EventosAuditoria where idEvento = @evento)
		/*si aun es valida la auditoria para esta tabla y si la operacion es modificacion*/
		if (@baja <> 'S') 	and (@op = 'M')
		begin
			Print cast(@@fetch_status as char(10))
			insert into tb_RegistroAuditoria(fecha, idUsuario, descripcion, dirIP, idAuditoria)
			values (@FechaRegistro, @usuario, 'Modificacion sobre tabla '+@table, @dirIP,@idAuditoria)
			Select @idRegistroAuditoria = @@Identity			
			-- SI EXISTE MAS DE UN CAMPO PARA GUARDAR SOBRE ESTA TABLA
			while @@fetch_status = 0 begin
				if (@Evento = 2) and (@campo <> '')
				begin
					select @valores = 'declare temporal cursor for '
					select @valores = @valores+'Select cast('+@campo+' as varchar(255)) from '+@table+' where '+@key+ ' = '+@value
					exec(@valores)
					open temporal
					fetch next from temporal into @valorCampo
					if (@idAccion = 3) begin
						print 'Hola2'
						insert into tb_DetalleAuditoria (idRegistroAuditoria, CampoOParam, valor)
						values (@idRegistroAuditoria, @campo,@valorCampo)
					end
					close temporal
					deallocate temporal
		 		end
			fetch next from cursor_Auditoria
			into @baja, @hasta, @campo, @evento, @idAccion, @idAuditoria			
			select @op = (Select evento from tb_EventosAuditoria where Evento = @evento)

			end --fin del buclue while
			
		end 
		close cursor_Auditoria
		deallocate cursor_Auditoria
GO
GRANT EXECUTE ON  [dbo].[spUpdateAudit] TO [public]
GO
